docker-compose 範例可參考 github 上的配置,主要是 prometheus、pushgateway 和 grafana 如果需要搭配告警需要 alertmanager 服務。nodeexporter 是官方提供監控主機資源的服務可參考此鏈結。同樣的使用 docker-compose up
就可以將服務啟動,但是配置檔需要依照需求進行修正。9090 Port 是 prometheus 預設的服務存取。
version: '3.6'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus:/etc/prometheus
- prometheus_pv:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--storage.tsdb.retention.time=24h'
- '--web.enable-lifecycle'
restart: unless-stopped
expose:
- "9090"
ports:
- 3010:9090
networks:
- monitor-net
labels:
org.label-schema.group: "monitor"
depends_on:
- grafana
- nodeexporter
- pushgateway
- alertmanager
pushgateway:
image: prom/pushgateway
container_name: pushgateway
volumes:
- pushgateway_pv:/data
command:
- --persistence.file=/data/pushgateway.data
- --persistence.interval=1h
restart: unless-stopped
expose:
- 9091
ports:
- 8080:9091
networks:
- monitor-net
labels:
org.label-schema.group: "monitor"
alertmanager:
image: prom/alertmanager
container_name: alertmanager
volumes:
- ./alertmanager:/prometheus
- alertmanager_pv:/data
command:
- '--config.file=/prometheus/alertmanager.yml'
- '--storage.path=/data'
networks:
- monitor-net
labels:
org.label-schema.group: "monitor"
org.label-schema.service: "alert"
grafana:
image: grafana/grafana
container_name: grafana
user: "472"
volumes:
- grafana_pv:/var/lib/grafana # docker volume create grafana_pv
- ./grafana/provisioning:/etc/grafana/provisioning
env_file:
- .env.grfana
restart: unless-stopped
ports:
- 3000:3000
networks:
- monitor-net
labels:
org.label-schema.group: "monitor"
nodeexporter:
image: prom/node-exporter
container_name: node_exporter
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
restart: unless-stopped
expose:
- 9100
network_mode: host
labels:
org.label-schema.group: "monitor"
networks:
monitor-net:
driver: bridge
volumes:
prometheus_pv: {}
grafana_pv: {}
alertmanager_pv: {}
pushgateway_pv: {}
在 /prometheus/prometheus.yml
下配置相關的參數
global:
scrape_interval: 5s # 多久獲取一次目標
evaluation_interval: 15s # 多久評估一次規則
rule_files: # 如果有使用 Alert,可用此關鍵字導入規則檔案
- alerts/*.yml
alerting:
alertmanagers:
- static_configs:
- targets:
# Alertmanager's default port is 9093
- alertmanager:9093
scrape_configs: # 以下是設定要抓取資料的不同服務
- job_name: 'nodeexporter' # 針對主機資源
metrics_path: /metrics
file_sd_configs:
- files:
- /etc/prometheus/nodeexporter.yml
refresh_interval: 3m
- job_name: 'cadvisor' # 針對容器
metrics_path: /metrics
file_sd_configs:
- files:
- /etc/prometheus/cadvisor.yml
refresh_interval: 3m
- job_name: 'postgresql-exporter' # 針對 postgresql
metrics_path: /metrics
file_sd_configs:
- files:
- /etc/prometheus/postgresqlexporter.yml
refresh_interval: 3m
- job_name: 'es-exporter'
scrape_interval: 60s
scrape_timeout: 30s
metrics_path: /metrics
file_sd_configs:
- files:
- /etc/prometheus/elasticsearchexporter.yml
refresh_interval: 3m
- job_name: 'pushgateway'
scrape_interval: 5s
honor_labels: true
file_sd_configs:
- files:
- /etc/prometheus/pushgateway.yml
refresh_interval: 3m
- job_name: 'otel-collector'
scrape_interval: 10s
static_configs:
file_sd_configs:
- files:
- /etc/prometheus/otel.yml
- job_name: 'docker'
static_configs:
- targets: ['192.168.101.129:9323']
labels:
group: 'local'
- job_name: 'prometheus'
scrape_interval: 10s
static_configs:
- targets: ['localhost:9090']
labels:
group: 'local'
scrape_configs
下是設定要抓取資料的不同服務。job_name
可用來做一個識別,scrape_interval
獲取 metric 的頻率,static_configs
通常都用來指定其要監控服務的位置。在 Spring boot 中我們就會透過 pushgateway
方式將我們的 metric 傳給 Prometheus。files
這些配置可以對應 /monitor/prometheus
下的內容。
內建,支持兩種向量,同時內建一組用於數據處理的函示
範圍向量可寫成 http_request_total{method="Get"} offset 5m
獲取過去 5 分鐘的資料;http_request_total{method="Get"}[5m] offset 1d
獲取一天之前的5分鐘內資料
=
!=
=~
!~
(1-avg(irate(node_cpu_seconds_total{mode='idle'}[5m])) by (instance)) * 100
Prom 是基於 pull 方式抓取數據,因此需要事先知道各個 Target 的位置,因此才需要服務發現方式來動態偵測 Target。
- job_name: "xxxx"
file_sd_configs:
- file:
- target/*.yml # 檔案路徑
refresh_interval: 2m # 每兩分鐘重新加載
metric_relabel_configs
,通常用來刪除不必要指標或著添加、刪除、修改指標的標籤值或格式而每個 Target 都有標籤。通常會有
__address__
__metrics_path__
metrics
__scheme__
global:
scrape_interval: 20s
evaluation_interval: 1m
在 Prom 中我們設置每 20s 獲取一次指標。評估間格(evaluation interval)為 1 分鐘。我們觸發一個告警會是:
指標監控時間+scrape_interval+evaluation_interval+FOR
告警規則配置如下,可參考此地方其提供許多相關告警配置:
groups:
- name: host
rules:
# Memory
# Node memory is filling up (< 10% left)
- alert: HostOutOfMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 2m
labels:
severity: warning
annotations:
summary: Host out of memory (instance {{ $labels.instance }})
description: Node memory is filling up (< 10% left)\n VALUE = {{ $value }}\n LABELS = {{ $labels }}
同時 prom 也進行配置,以用來觸發告警
rule_files: # 規則的路徑
- alerts/*.yml
alerting: # 與 alertmanagers 配置
alertmanagers:
- static_configs:
- targets:
# Alertmanager's default port is 9093
- alertmanager:9093
通知的配置可參考此鏈接
簡單來說就是數據來源。
新增一個儀表板來實驗
使用 promQL 進行獲取數據指標
Setting Default | value |
---|---|
GF_PATHS_CONFIG | /etc/grafana/grafana.ini |
GF_PATHS_DATA | /var/lib/grafana |
GF_PATHS_HOME | /usr/share/grafana |
GF_PATHS_LOGS | /var/log/grafana |
GF_PATHS_PLUGINS | /var/lib/grafana/plugins |
GF_PATHS_PROVISIONING | /etc/grafana/provisioning |
這邊個人對於 JVM 的內容其實不是很熟習,這一部分是我未來要學習的目標,雖然 Promethues 與 Grafana 都有配置好,但對於應用程式服務的程式語言或是生命週期這些不熟悉都是沒意義的。
在 Actuator
部分提供了很多的端點給我們使用像